AWS LambdaのPython版で何が出来るか色々検証してみた
サーモン大好き、横山です。
今回 AWS Lambda
のPython対応で何が出来るのか色々と気になったので、検証してみました。
以下の内容は、(2015/10/13現在の情報です)
CPUは?
Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz
の 2コアの環境で動いてるらしいです。
プログラム
import commands def _(cmd): return commands.getoutput(cmd) def lambda_handler(event, context): print _('cat /proc/cpuinfo | grep -e processor -e Xeon')
実行結果
メモリは?
約 4GB
のメモリで動いてるらしいです。
プログラム
import commands def _(cmd): return commands.getoutput(cmd) def lambda_handler(event, context): print _('cat /proc/meminfo | grep MemTotal')
実行結果
環境変数は?
AWS_*
の環境変数だけ設定されています。PATHはsbin含まれていないので、そっち方面のコマンド叩く際はフルパスで入力する必要ですね。
プログラム
import commands def _(cmd): return commands.getoutput(cmd) def lambda_handler(event, context): print _('ENV')
実行結果
OSは?
OSは Amazon Linux AMI 2015.03
で動いてるみたいです。
プログラム
import commands def _(cmd): return commands.getoutput(cmd) def lambda_handler(event, context): print _('cat /etc/os-release')
実行結果
実行ファイルは?
Edit code inline
で実行していると /var/task/lambda_function.py
で実行されていて、外部から呼ばれているらしいです。
プログラム
def lambda_handler(event, context): print __file__ print __name__
実行結果
実行してるユーザは?
ec2-user
じゃないんですね。 sbx_userXXXX
のユーザで実行しているらしいです。
うちが実行確認している感じでは、同じLambda functionでは、ユーザは変わらなかったです。
プログラム
import commands def _(cmd): return commands.getoutput(cmd) def lambda_handler(event, context): print _('id')
実行結果
sbx_userXXXX はいくつある?
100ユーザほどいます。番号は 1051-1150
の連番で存在します。
他のインスタンスがどうなっているかはわかりません。
余談ですが、Log output出来るのが最大 4094バイト ってのがわかりました。 4094バイトより多い出力があると、先頭の出力が削られ、末尾の出力だけLog outputに出ます。
プログラム
import commands def _(cmd): return commands.getoutput(cmd) def lambda_handler(event, context): filename = '/rgp/cnffjq'.encode('rot13') print ', '.join(_('cat %s | grep sbx_user | cut -d: -f1' % filename).split('\n')) print _('cat %s | grep sbx_user | wc -l' % filename)
実行結果
ファイルは作成可能か
実行ファイルと同じ場所には作成出来ません。
/tmp/
にはファイルを作成出来ますが、実行後消されるので保持目的では使用しない方がいいですね。
プログラム
カレントディレクトリ
import commands def _(cmd): return commands.getoutput(cmd) def lambda_handler(event, context): print _('echo "classmethod" >> ./file') print '='*10 print _('ls -l ./') print '='*10 print _('ls -l ../ | grep task')
/tmp ディレクトリ
import commands def _(cmd): return commands.getoutput(cmd) def lambda_handler(event, context): print _('echo "classmethod" >> /tmp/file') print '='*10 print _('ls -l / | grep tmp') print '='*10 print _('ls -l /tmp')
実行結果
カレントディレクトリ
/tmp ディレクトリ
インスタンスメタデータが取れるか?
取れませんでした。
プログラム
import commands def _(cmd): return commands.getoutput(cmd) def lambda_handler(event, context): print _('/usr/bin/curl http://169.254.169.254/latest/meta-data/public-ipv4') print _('/usr/bin/curl http://169.254.169.254/latest/meta-data/instance-id')
実行結果
まとめ
AWS Lambdaを使う上で気にしなくていい部分でしょうけど、 うち個人で気になったことを色々とまとめて見ました。